package com.cskaoyan.javse.oop3._2inner._1member._0introduction;

/**
 * @description: 成员内部类的基本特点/引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 成员内部类概述
 * - 成员内部类是最普通的内部类，它定义在另一个类的成员位置,可以看成该类的一个成员
 * - 语法
 *   [访问权限修饰符] class EnclosedClazz{ //外围（普通）类的访问权限修饰符，只有两个，public和缺省
 *   	[访问权限修饰符] class InnerClazz{//内部类访问权限修饰符，有四个，和普通成员一样
 *       }
 *   }
 *
 *
 *
 * > 成员内部类自身的特点
 * > 1，访问权限修饰符
 *      成员内部类可以看成另一个类的成员,它和成员一样,有四种访问权限:
 *          a.public
 *          b.protected
 *          c.(缺省)默认访问权限
 *          d.private
 *   如果想要在外围类的外部,也就是在外部类中去访问内部类,需要首先具有外围类的权限,其次还需要有内部类的权限
 *
 *
 * 在具体理解成员内部类中定义成员的特点之前,我们要先明白两点:
 *      1.成员内部类的类加载时机(何时触发类加载)
 *          类加载是懒加载,一定会触发类加载的情况称之为类加载的时机
 *          类加载的时机:
 *              a.启动main方法
 *              b.创建对象
 *              c.访问(非final)静态成员
 *              d.触发子类类加载,优先类加载父类(成员内部类很少继承)
 *           成员内部类的类加载,实际上主要依赖于创建它的对象,因为它里面没有静态声明
 *
 *      2.如何创建成员内部类对象?
 *          成员内部类的最大特点: 要想创建成员内部类对象,必须先创建外围类对象
 *          从这点考虑,类加载顺序,一定先类加载外围类,然后才会类加载成员内部类
 *
 * > 2，成员特点
 *      a.成员变量
 *          可以定义普通成员变量,但不能是static成员变量,可以定义全局常量,但只能是那些不会触发类加载的全局常量,也就是说成员变量没有静态声明
 *
 *      b.成员方法
 *          可以是普通成员方法,但不能是静态成员方法
 *
 *      c.构造器
 *          有构造器,用于自身创建对象使用
 *
 *      d.代码块
 *          有构造代码块,但是没有静态代码块
 *
 * > 3，继承和实现
 *      可以继承也可以实现
 *      当然在成员位置,也可以定义接口和抽象类
 *
 *  思考题:
 *      在有权限的情况下,外部类是否可以继承一个成员内部类?
 *      可以,但是需要一些操作(自行想一下,或者查一下资料)
 *
 */

//外部类
public class Demo {
}

//外围类
class EnclosedClazz {


    interface IA {
    }

    abstract class AbstractClazz {
    }

    //定义成员内部类
    class MemberInnerClazz extends AbstractClazz implements IA {
        //定义成员变量
        int a = 10;
        private int b;
        //static int c;
        static final int D = 20;
        static final String E = "str";
        //static final String F = new String("");

        //定义成员方法
        public void test() {
        }
        //Inner classes cannot have static declarations
        //public static void testStatic(){}

        {
        }
        //static {}

        public MemberInnerClazz() {
        }

        public MemberInnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }
    }


}
